package com.h.forum.services;


import com.h.forum.pojo.model.Article;
import com.h.forum.pojo.request.ArticleCreateRequest;
import org.apache.ibatis.annotations.Param;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

public interface IArticleService {
    /**
     * 创建一个新的帖子
     * 这个如果创建新的帖子的话，那么对于发布的人的对应的帖子数量需要加一
     * 并且这个板块中对应的帖子数也需要加一操作
     * 那么这里就涉及到多表联合的操作，那这里需要使用事务进行统一操作
     * @param request
     */
    @Transactional
    void create(Article request);

    /**
     * 查询所有的帖子列表
     * @return
     */
    List<Article> selectAll();

    /**
     * 根据 板块Id进行查询对应的板块信息
     * @param boardId
     * @return
     */
    List<Article> selectAllByBoardId(Long boardId);

    /**
     * 根据帖子Id查询帖子详情
     * @param id
     * @return
     */
    Article selectDetailById(Long id);

    /**
     * 编辑帖子
     * @param article
     */
    void modify(Article article);

    /**
     * 根据帖子Id，进行查询对应的信息
     * @param id
     * @return
     */
    Article selectById(Long id);

    /**
     * 点赞功能
     * @param id
     */
    void thumbsUpById(Long id);

    /**
     * 删除帖子
     * 这里需要添加事务操作，
     * 因为这个删除操作会使 用户的帖子数减小，对应板块的帖子数减小，所以都需要成功，使用事务保证一致性
     * @param id
     */
    @Transactional
    void deleteById(Long id);

    /**
     * 对于回复数量进行 加一 操作
     * @param id
     */
    void addOneReplyCountById(Long id);

    /**
     * 根据用户Id、，获取到对应的帖子列表
     * @param userId
     * @return
     */
    List<Article> selectByUserId(Long userId);
}
